﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data;
using System.Data.SqlClient;

namespace ForrajeriaDAL
{
    public class PedidoClienteDAL : AccesoDAL, InterfazDAL<PedidoClienteMO>
    {
        private static string Insert = "PedidoCliente_INSERT";
        private static string update = "PedidoCliente_Update";
        private static string getbyClient = "PedidoCliente_GetbyClientXestado";
        private static string getbyId = "PedidoCliente_GetbyID";



        /*
         * ***************************************************************************************************************** *
         *                                                                                                                   *
         *  ESTADO = 'A' ---------------------------------------------> CREADO Y PENDIENTE DE AUTORIZACION                   *
         *  ESTADO = 'B' ---------------------------------------------> AUTORIZADO                                           *
         *  ESTADO = 'C' ---------------------------------------------> FACTURADO                                            *
         *  ESTADO = 'D' ---------------------------------------------> DADO DE BAJA POR EL USUARIO                          *
         *  ESTADO = 'E' ---------------------------------------------> NO SE AUTORIZO Y LA FECHA DE HOY ES MAYOR A DESEADA  *
         *                                                                                                                   *
         * ***************************************************************************************************************** *                                                                                                      *


        */
        #region Singleton
        private static PedidoClienteDAL instancePedido;

        private PedidoClienteDAL()
            : base()
        {

        }
        private SqlCommand cmd;
        public static PedidoClienteDAL getInstance
        {
            get 
            {
                if (instancePedido == null)
                {
                    instancePedido = new PedidoClienteDAL();
                }
                return instancePedido;
            }
        }
        #endregion 

        #region Interfaz

        public List<PedidoClienteMO> GetAll()
        {
            throw new NotImplementedException();
        }

        public void Adicionar(PedidoClienteMO item)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(PedidoClienteMO item)
        {
            throw new NotImplementedException();
        }

        public void Actualizar(PedidoClienteMO nuevoItem, PedidoClienteMO origItem)
        {
             cmd = new SqlCommand(update, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@nroPedido", SqlDbType.Int).Value = origItem.NroPedido;
            cmd.Parameters.Add("@fechaPedido", SqlDbType.DateTime).Value = nuevoItem.FechaPedido;
            cmd.Parameters.Add("@id_cliente", SqlDbType.Int).Value = nuevoItem.Id_cliente;
            cmd.Parameters.Add("@estado", SqlDbType.VarChar, 10).Value = nuevoItem.EstadoPedido;
            cmd.Parameters.Add("@totalPedido", SqlDbType.Float).Value = nuevoItem.TotalPedido;
            cmd.Parameters.Add("@fechaAutorizacion", SqlDbType.DateTime).Value = nuevoItem.FechaAuto;
            cmd.Parameters.Add("@fechaDeseadaCliente", SqlDbType.DateTime).Value = nuevoItem.FechaDeseada;

            try
            {
                opencon();
                cmd.ExecuteNonQuery();

            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);

            }

            catch (Exception ex)
            {
                throw new Exception("Error Desconocido :" + ex.Message);

            }

            finally
            {
                closecon();
            }

        }

        #endregion

        public DataTable obtenerDetalle(int nroPedido)
        {
            DataTable dt = new DataTable();

            try
            {
                SqlCommand cmd = new SqlCommand("GenericDetallePedidoCliente2", getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@IDPEDIDO", SqlDbType.Int).Value = nroPedido;

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                opencon();

                da.Fill(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
                
            }
            return dt;
        }

       public int AdicionarRetorno(PedidoClienteMO item)
        {
            try
            {
                item.NroPedido = getCodigoInsert("PedidoCliente", "nroPedido");

                SqlCommand cmd = new SqlCommand(Insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@nroPedido", SqlDbType.Int).Value = item.NroPedido;
                cmd.Parameters.Add("@fechaPedido", SqlDbType.DateTime).Value = item.FechaPedido;
                cmd.Parameters.Add("@id_cliente", SqlDbType.Int).Value = item.Id_cliente;
                cmd.Parameters.Add("@estado", SqlDbType.VarChar, 10).Value = item.EstadoPedido;
                cmd.Parameters.Add("@totalPedido", SqlDbType.Float).Value = item.TotalPedido;
                cmd.Parameters.Add("@fechaAutorizacion", SqlDbType.DateTime).Value = item.FechaAuto;
                cmd.Parameters.Add("@fechaDeseadaCliente", SqlDbType.DateTime).Value = item.FechaDeseada;

                opencon();

                cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
                

            finally
            {
                closecon();
            }

            return item.NroPedido;
        }

        public PedidoClienteMO getXid(int id)
        {
            cmd = new SqlCommand(getbyId, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;

            SqlDataReader rea;

            try
            {
                opencon();
                rea = cmd.ExecuteReader();
                PedidoClienteMO aux = new PedidoClienteMO();
                
                if(rea.Read())
                {
                     
                    aux.EstadoPedido = rea["estado"].ToString();
                    aux.FechaPedido = DateTime.Parse(rea["fechaPedido"].ToString());
                    if (rea["fechaAutorizacion"].ToString() != "")
                        aux.FechaAuto = DateTime.Parse(rea["fechaAutorizacion"].ToString());

                    if (rea["fechaDeseadaCliente"].ToString() != "")
                        aux.FechaDeseada = DateTime.Parse(rea["fechaDeseadaCliente"].ToString());

                    aux.Id_cliente = int.Parse(rea["id_cliente"].ToString());
                    aux.NroPedido = int.Parse(rea["nroPedido"].ToString());
                    aux.TotalPedido = double.Parse(rea["totalPedido"].ToString());

                    
                }

                rea.Close();
                return aux;
            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }

            catch (Exception ex)
            {
                throw new Exception("Error Desconocido: " + ex.Message);
            }

            finally
            {

                closecon();
            }



        }


        public List<PedidoClienteMO> getbyClientIDxEstado(int clienteID = 0,string estado= "")
        {
            //ACEPTA NULO EN AMBOS PARAMETROS!!!!!
            List<PedidoClienteMO> reto = new List<PedidoClienteMO>();
            cmd = new SqlCommand(getbyClient, getConexion());
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Idcliente", SqlDbType.Int).Value = clienteID;
            cmd.Parameters.Add("@estado", SqlDbType.VarChar).Value = estado;
            SqlDataReader rea;

            try
            {
                opencon();
                rea = cmd.ExecuteReader();

                while (rea.Read())
                {
                    PedidoClienteMO aux = new PedidoClienteMO();
                    aux.EstadoPedido = rea["estado"].ToString();
                    aux.FechaPedido = DateTime.Parse(rea["fechaPedido"].ToString());
                    if (rea["fechaAutorizacion"].ToString() != "")
                        aux.FechaAuto = DateTime.Parse(rea["fechaAutorizacion"].ToString());

                    if (rea["fechaDeseadaCliente"].ToString() != "")
                        aux.FechaDeseada = DateTime.Parse(rea["fechaDeseadaCliente"].ToString());

                    aux.Id_cliente = int.Parse(rea["id_cliente"].ToString());
                    aux.NroPedido = int.Parse(rea["nroPedido"].ToString());
                    aux.TotalPedido = double.Parse(rea["totalPedido"].ToString());

                    
                    
                    reto.Add(aux);
                }

                rea.Close();
                return reto;
            }
            catch (SqlException ex)
            {
                throw new Exception("Error SQL: " + ex.Message);
            }

            catch (Exception ex)
            {
                throw new Exception("Error Desconocido: " + ex.Message);
            }

            finally
            {

                closecon();
            }

        }
            public DataTable ReportePedidos(string fechaInicio = "",string fechaFin ="",string estado="0", string columna= "", string dire = "")
            {
                string sql = "";
            sql = "SELECT p.nroPedido as 'Numero_Pedido', p.fechaPedido as 'Fecha_Pedido', p.totalPedido as 'Total_Pedido',p.fechaAutorizacion as 'Fecha_Autorizacion',p.fechaDeseadaCliente as 'Fecha_deseada_Cliente',c.codigo as 'Codigo_Cliente',c.Nombrecliente as 'Nombre_Cliente',c.ApellidoCliente as 'Apellido_Cliente'"
                +" FROM PedidoCliente p"
                +" left join Cliente c on p.id_cliente = c.codigo"
                +" WHERE 1=1";
                
                
            try
            {
                DataTable dt = new DataTable();

                SqlCommand cmd = new SqlCommand();

                if (fechaInicio != "")
                {

                    sql += " and  p.fechaPedido >= @fechaIni";
                    cmd.Parameters.Add("@fechaIni", SqlDbType.VarChar).Value = fechaInicio;
                }

                if (fechaFin != "")
                {
                    sql += " and p.fechaPedido <= @fechaFin";
                    cmd.Parameters.Add("@fechaFin",SqlDbType.VarChar).Value = fechaFin;
                }
                
                if (estado != "0")
                {
                    sql += " and  p.estado = @estado";
                    cmd.Parameters.Add("@estado", SqlDbType.VarChar).Value = estado;
                }
                
                if (columna != "")
                {

                    sql += " Order by " + columna;

                }
                if (dire != "")
                    sql += " " + dire;


                cmd.Connection = (getConexion());

                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                opencon();
                da.Fill(dt);
                closecon();
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
            }
            }


        }











}


